/** 
* Copyright (C) 2012-2017 ZEEI Inc.All Rights Reserved.
* 项目名称：common
* 文件名称：BasicController.java
* 包  名 称：com.zeei.common.controller
* 文件描述：控制器基类
* 创建日期：2017年7月4日下午4:36:24
* 
* 修改历史
* 1.0 luoxianglin 2017年7月4日下午4:36:24 创建文件
*
*/
package com.zeei.ems.base.controller;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.github.pagehelper.PageInfo;
import com.zeei.ems.base.constant.GlobalConstant;
import com.zeei.ems.base.result.ResultBasicVO;
import com.zeei.ems.base.result.ResultDataVO;
import com.zeei.ems.base.result.ResultRowsVO;
import com.zeei.ems.base.result.ResultVO;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.util.StringUtil;


/**
 * @类型名称：BasicController
 * @类型描述：控制器基类
 * @功能描述：提供基础的方法
 * @创建作者：luoxianglin
 */
public class BasicController {

	@Autowired
	protected HttpServletRequest request;
	@Autowired
	protected HttpServletResponse response;
	@Autowired
	protected HttpSession session;


	public String getSessionId() {
		String sid = "";
		if (request != null) {
			Cookie[] cookies = request.getCookies();
			if (cookies != null) {
				for (Cookie cookie : cookies) {
					if (!cookie.getName().equals("sid")) {
						continue;
					}
					sid = cookie.getValue();
				}
			}
			if (StringUtils.isEmpty(sid)) {
				sid = request.getHeader("sid");
			}
		}
		return sid;
	}

	/**
	 * 方法描述:获取客户端IP
	 *
	 * @return
	 * @throws UnknownHostException
	 */
	public String getClientIP() {
		String clientIP = request.getRemoteAddr();
		if ("127.0.0.1".equals(clientIP) || "0:0:0:0:0:0:0:1".equals(clientIP)) {
			try {
				clientIP = InetAddress.getLocalHost().getHostAddress();
			} catch (UnknownHostException e) {
				throw new RuntimeException(e);
			}
		}
		return clientIP;
	}

	public <T> ResultVO<T> createResultVO(List<T> listData, T data, boolean flag, int total) {
		return createResultVO(listData, data, flag, StringUtils.EMPTY, total);
	}

	/***
	 *
	 * createResultVO:(返回统一的ResultVO对象).
	 *
	 * @param listData
	 *            数据库返回多条数据的时候使用
	 * @param data
	 *            数据库返回一条数据的时候使用
	 * @param flag
	 *            成功，失败标记
	 * @param message
	 *            需要设置的消息
	 * @return
	 */
	public <T> ResultVO<T> createResultVO(List<T> listData, T data, boolean flag, String message, int total) {
		ResultVO<T> resultVO = new ResultVO<T>();
		if (flag == true) {
			resultVO.setResult(GlobalConstant.SUCCEED);
			if (null != data) {
				resultVO.setData(data);
			}
			if (null != listData) {
				resultVO.setRows(listData);
			}
		} else {
			resultVO.setResult(GlobalConstant.FAILED);
		}

		if (StringUtils.isEmpty(message) == false) {
			resultVO.setMessage(message);
		}

		if (total > 0) {
			resultVO.setTotal(total);
		}

		return resultVO;
	}

	public <T> ResultRowsVO<T> createResultRowsVO(List<T> listData, boolean flag, int total) {
		return createResultRowsVO(listData, flag, StringUtils.EMPTY, total);
	}

	public <T> ResultRowsVO<T> createResultRowsVO(PageInfo<T> listData, boolean flag) {
		return createResultRowsVO(listData.getList(), flag, StringUtils.EMPTY,
				new Long(listData.getTotal()).intValue());
	}

	public <T> ResultRowsVO<Map<String, Object>> createResultMapRowsVO(PageInfo<Map<String, Object>> listData, boolean flag) {
		ResultRowsVO<Map<String, Object>> resultVO = new ResultRowsVO<>();
		resultVO.setResult(flag);

		 if (listData!= null){
			List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
			 if (!CollectionUtils.isEmpty(listData.getList())) {
				 for(Map<String, Object> maps : listData.getList()){
					 Map<String, Object> map = new HashMap<>();
					 for (Map.Entry<String, Object> entry : maps.entrySet()) {
						 String newKey = entry.getKey().toLowerCase();
						 map.put(newKey, entry.getValue());
					 }

					 list.add(map);
				}
			 }
			 resultVO.setRows(list);

			 if (listData.getTotal() > 0) {
				resultVO.setTotal(listData.getTotal());
			}
		 }

		return resultVO;
	}

	/**
	 * 方法描述：ResultRowsVO:(返回统一的ResultRowsVO对象)
	 *
	 * @param listData
	 * @param flag
	 * @param message
	 * @param total
	 *            总记录 数
	 * @return
	 */
	public <T> ResultRowsVO<T> createResultRowsVO(List<T> listData, boolean flag, String message, int total) {
		ResultRowsVO<T> resultVO = new ResultRowsVO<T>();
		resultVO.setResult(flag);
		if (null != listData) {
			resultVO.setRows(listData);
		}

		if (StringUtils.isEmpty(message) == false) {
			resultVO.setMessage(message);
		}

		if (total > 0) {
			resultVO.setTotal(total);
		}

		return resultVO;
	}

	/**
	 *
	 * createResultRowsVO:带分页的数据列表返回方法
	 *
	 * @param dataInfo
	 *            数据列表
	 * @param flag
	 *            是否成功
	 * @return ResultRowsVO<T> 返回类型
	 */
	public <T> ResultRowsVO<T> createResultRowsVO(PageInfo<T> dataInfo, boolean flag, String message) {
		ResultRowsVO<T> resultVO = new ResultRowsVO<T>();
		if (flag) {
			resultVO.setResult(GlobalConstant.SUCCEED);

			if (null != dataInfo) {
				resultVO.setRows(dataInfo.getList());
			}
		} else {
			resultVO.setResult(GlobalConstant.FAILED);
		}

		if (StringUtil.isNotEmpty(message)) {
			resultVO.setMessage(message);
		}

		if (null != dataInfo && dataInfo.getTotal() > 0) {
			resultVO.setTotal((int) dataInfo.getTotal());
		}

		return resultVO;
	}

	public <T> ResultDataVO<T> createResultDataVO(T data, boolean flag) {
		return createResultDataVO(data, flag, StringUtils.EMPTY);
	}

	/**
	 * 方法描述：ResultDataVO:(返回统一的ResultDataVO对象 )
	 *
	 * @param data
	 * @param flag
	 * @param message
	 * @return
	 */
	public <T> ResultDataVO<T> createResultDataVO(T data, boolean flag, String message) {
		ResultDataVO<T> resultVO = new ResultDataVO<T>();
		resultVO.setResult(flag);
		if (null != data) {
			resultVO.setData(data);
		}

		if (StringUtils.isEmpty(message) == false) {
			resultVO.setMessage(message);
		}

		return resultVO;
	}

	public ResultBasicVO createResultBasicVO(boolean flag) {
		return createResultBasicVO(flag, StringUtils.EMPTY);
	}

	/**
	 *
	 * createResultBasicVO:(返回统一的createResultBasicVO对象,简单的请求成功或者失败JSON数据结构).
	 *
	 * @param flag
	 * @param message
	 * @return
	 */
	public ResultBasicVO createResultBasicVO(boolean flag, String message) {
		ResultBasicVO resultVO = new ResultBasicVO();
		resultVO.setResult(flag);

		if (StringUtils.isEmpty(message) == false) {
			resultVO.setMessage(message);
		}

		return resultVO;
	}

	/***
	 * 
	 * queryListResult:(返回统一的ResultVO对象).
	 * 
	 * @param result
	 *            成功，失败标记
	 * @param message
	 *            需要设置的消息
	 * @param data
	 *            数据库返回多条数据的时候使用
	 * @param total
	 *            数据总记录条数，分页时使用
	 * @return
	 */
	public <T> ResultVO<T> queryListResult(boolean result, String message, List<T> data, int total) {
		ResultVO<T> resultObj = new ResultVO<T>();
		if (total == 0 || data == null || data.size() <= 0) {
			resultObj.setMessage(GlobalConstant.DATANULL);
		} else {
			resultObj.setMessage(message);
		}

		if (data == null) {
			data = new ArrayList<T>();
		}

		resultObj.setResult(result);
		resultObj.setRows(data);
		resultObj.setTotal(total);

		return resultObj;
	}

	/***
	 * 
	 * queryDataResult:(返回统一的ResultVO对象).
	 * 
	 * @param result
	 *            成功，失败标记
	 * @param message
	 *            需要设置的消息
	 * @param data
	 *            数据库返回一条数据的时候使用
	 * @return
	 */
	public <T> ResultVO<T> queryDataResult(boolean result, String message, T data) {
		ResultVO<T> resultObj = new ResultVO<T>();
		if (data == null) {
			resultObj.setMessage(GlobalConstant.DATANULL);
		} else {
			resultObj.setMessage(message);
		}

		resultObj.setResult(result);
		resultObj.setData(data);
		resultObj.setTotal(1);

		return resultObj;
	}

	/***
	 * 
	 * queryOKResult:(返回统一的ResultVO对象).
	 * 
	 * @param data
	 *            数据库返回多条数据的时候使用
	 * @param total
	 *            数据总记录条数，分页时使用
	 * @return
	 */
	public <T> ResultVO<T> queryOKResult(List<T> data, int total) {
		ResultVO<T> resultObj = new ResultVO<T>();
		if (total == 0 || data == null || data.size() <= 0) {
			resultObj.setMessage(GlobalConstant.DATANULL);
		} else {
			resultObj.setMessage("");
		}

		if (data == null) {
			data = new ArrayList<T>();
		}

		resultObj.setResult(GlobalConstant.SUCCEED);
		resultObj.setRows(data);
		resultObj.setTotal(total);

		return resultObj;
	}

	/***
	 * 
	 * queryErrorResult:(返回统一的ResultVO对象).
	 * 
	 * @param message
	 *            需要设置的消息
	 * @return
	 */
	public <T> ResultVO<T> queryErrorResult(String message) {
		ResultVO<T> resultObj = new ResultVO<T>();
		resultObj.setResult(GlobalConstant.FAILED);
		resultObj.setMessage(message);
		resultObj.setTotal(0);

		return resultObj;
	}

	/**
	 * 保存成功返回值
	 * 
	 * @param data
	 *            保存对象
	 * @return 返回保存成功消息和保存对象
	 */
	public <T> ResultVO<T> saveOKResult(T data) {
		ResultVO<T> resultObj = new ResultVO<T>();
		resultObj.setResult(GlobalConstant.SUCCEED);
		resultObj.setMessage(GlobalConstant.SUCCESS_SAVE);
		resultObj.setData(data);

		return resultObj;
	}

	/**
	 * 保存成功返回值
	 * 
	 * @return 返回保存成功消息
	 */
	public ResultVO<String> saveOKResult() {
		ResultVO<String> resultObj = new ResultVO<String>();
		resultObj.setResult(GlobalConstant.SUCCEED);
		resultObj.setMessage(GlobalConstant.SUCCESS_SAVE);

		return resultObj;
	}

	/**
	 * 保存失败返回值
	 * 
	 * @return 返回保存成功消息
	 */
	public ResultVO<String> saveErrorResult() {
		ResultVO<String> resultObj = new ResultVO<String>();
		resultObj.setResult(GlobalConstant.FAILED);
		resultObj.setMessage(GlobalConstant.FAILED_SAVE);

		return resultObj;
	}

	/**
	 * 保存成功返回值
	 * 
	 * @return 返回保存成功消息
	 */
	public ResultVO<String> deleteOKResult() {
		ResultVO<String> resultObj = new ResultVO<String>();
		resultObj.setResult(GlobalConstant.SUCCEED);
		resultObj.setMessage(GlobalConstant.SUCCESS_DELETE);

		return resultObj;
	}

	/**
	 * 保存失败返回值
	 * 
	 * @return 返回保存成功消息
	 */
	public ResultVO<String> deleteErrorResult() {
		ResultVO<String> resultObj = new ResultVO<String>();
		resultObj.setResult(GlobalConstant.FAILED);
		resultObj.setMessage(GlobalConstant.FAILED_DELETE);

		return resultObj;
	}
}
